//package com.sunwayworld.basemodule.rm.equipment.equiptfileacq.exector.impl;
//
//import com.hierynomus.msdtyp.AccessMask;
//import com.hierynomus.msfscc.FileAttributes;
//import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation;
//import com.hierynomus.mssmb2.SMB2CreateDisposition;
//import com.hierynomus.mssmb2.SMB2CreateOptions;
//import com.hierynomus.mssmb2.SMB2ShareAccess;
//import com.hierynomus.smbj.SMBClient;
//import com.hierynomus.smbj.auth.AuthenticationContext;
//import com.hierynomus.smbj.connection.Connection;
//import com.hierynomus.smbj.session.Session;
//import com.hierynomus.smbj.share.DiskShare;
//import com.sunwayworld.baseline.framework.utils.FTPUtil;
//import com.sunwayworld.baseline.framework.utils.SmbV1Utils;
//import com.sunwayworld.basemodule.trm.equipt.equiptfileacq.bean.LimsEquiptFileAcqBean;
//import com.sunwayworld.basemodule.trm.equipt.equiptfileacq.bean.LimsEquiptFileAcqConfigBean;
//import com.sunwayworld.basemodule.trm.equipt.equiptfileacq.exector.FileAcqExector;
//import com.sunwayworld.basemodule.trm.equipt.equiptfileacq.service.LimsEquiptFileAcqService;
//import com.sunwayworld.framework.context.ApplicationContextHelper;
//import com.sunwayworld.framework.exception.InvalidDataException;
//import com.sunwayworld.framework.mybatis.mapper.MatchPattern;
//import com.sunwayworld.framework.mybatis.mapper.SearchFilter;
//import com.sunwayworld.framework.utils.ObjectUtils;
//import com.sunwayworld.framework.utils.SystemUtils;
//import jcifs.smb.SmbFile;
//import jcifs.smb.SmbFileInputStream;
//import org.apache.commons.lang3.exception.ExceptionUtils;
//import org.apache.commons.net.ftp.FTP;
//import org.apache.commons.net.ftp.FTPClient;
//import org.apache.commons.net.ftp.FTPFile;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.springframework.stereotype.Component;
//import org.springframework.stereotype.Repository;
//
//import java.io.*;
//import java.text.SimpleDateFormat;
//import java.time.Instant;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//
//@Repository("defaultAcqExector")
//public class DefaultAcqExector implements FileAcqExector {
//
//    private static final Logger logger = LogManager.getLogger(DefaultAcqExector.class);
//
//    private final String EXECTOR_NAME = "defaultAcqExector";
//
//    @Override
//    public List<LimsEquiptFileAcqBean> acqFileFromFtp(FTPClient ftpClient, LimsEquiptFileAcqConfigBean equiptFileAcqConfigBean) {
//        boolean changeWorkingDirectoryFlag = false;
//        String rootPath = equiptFileAcqConfigBean.getFilePath();
//        try{
//            changeWorkingDirectoryFlag = ftpClient.changeWorkingDirectory(new String((rootPath).getBytes(), FTP.DEFAULT_CONTROL_ENCODING));
//        }catch(Exception e){
//            e.printStackTrace();
//        }
//        if (!changeWorkingDirectoryFlag){
//            logger.error("设备文件->本地  切换目录到采集目录失败！ equiptCode:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"));
//            FTPUtil.close(ftpClient);
//            throw new InvalidDataException("设备文件->本地  切换目录到采集目录失败！");
//        }
//
//        LimsEquiptFileAcqService limsEquiptFileAcqService = ApplicationContextHelper.getBean(LimsEquiptFileAcqService.class);
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeanList = limsEquiptFileAcqService.selectListByFilter(SearchFilter.instance()
//                .match("equiptId",equiptFileAcqConfigBean.getEquiptId()).filter(MatchPattern.EQ));
//
//        List<LimsEquiptFileAcqBean> limsEquiptFileAcqBeans = scanFolderFromFtp(ftpClient, equiptFileAcqConfigBean, equiptFileAcqBeanList, "");
//
//        List<Long> ids = ApplicationContextHelper.getNextIdentityList(limsEquiptFileAcqBeans.size());
//        limsEquiptFileAcqBeans.forEach(e -> e.setId(ids.remove(0)));
//        return limsEquiptFileAcqBeans;
//    }
//
//    @Override
//    public List<LimsEquiptFileAcqBean> acqFileFromShareDocV1(SmbFile smbFile, LimsEquiptFileAcqConfigBean equiptFileAcqConfigBean) {
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeans = new ArrayList<>();
//        String path = equiptFileAcqConfigBean.getFilePath();
//        String saveUrl = equiptFileAcqConfigBean.getSavePath();
//        String localPath = SystemUtils.getWorkingPath().resolve("files").resolve("equipt").toFile().getAbsolutePath()+saveUrl;
//
//        LimsEquiptFileAcqService limsEquiptFileAcqService = ApplicationContextHelper.getBean(LimsEquiptFileAcqService.class);
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeanList = limsEquiptFileAcqService.selectListByFilter(SearchFilter.instance()
//                .match("equiptId",equiptFileAcqConfigBean.getEquiptId()).filter(MatchPattern.EQ));
//
//        try {
//            //遍历文件夹
//            equiptFileAcqBeans = scanFolderFromDocV1(path, localPath, equiptFileAcqConfigBean, equiptFileAcqBeanList);
//        }catch (Exception e){
//            logger.error(ExceptionUtils.getStackTrace(e));
//            throw new InvalidDataException("downloadFolder 获取共享文档文件失败");
//        }
//
//        List<Long> ids = ApplicationContextHelper.getNextIdentityList(equiptFileAcqBeans.size());
//        equiptFileAcqBeans.forEach(e -> e.setId(ids.remove(0)));
//        return equiptFileAcqBeans;
//    }
//
//    @Override
//    public List<LimsEquiptFileAcqBean> acqFileFromShareDocV23(Session session, LimsEquiptFileAcqConfigBean equiptFileAcqConfigBean) {
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeans = new ArrayList<>();
//        String path = equiptFileAcqConfigBean.getFilePath()+"/";
//        String saveUrl = equiptFileAcqConfigBean.getSavePath();
//        String pathValue = path;
//        path = path.substring(1,path.length());
//        String url = path.substring(0,path.indexOf("/"));
//        path = path.substring(path.indexOf("/")+1,path.length());
//        String localPath = SystemUtils.getWorkingPath().resolve("files").resolve("equipt").toFile().getAbsolutePath()+saveUrl;
//
//        DiskShare diskShare = null;
//
//        LimsEquiptFileAcqService limsEquiptFileAcqService = ApplicationContextHelper.getBean(LimsEquiptFileAcqService.class);
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeanList = limsEquiptFileAcqService.selectListByFilter(SearchFilter.instance()
//                .match("equiptId",equiptFileAcqConfigBean.getEquiptId()).filter(MatchPattern.EQ));
//
//        try {
//            //操作共享文档
//            diskShare = (DiskShare) session.connectShare(url);
//            //遍历文件夹
//            equiptFileAcqBeans = scanFolderFromDocV23(diskShare, path, localPath, equiptFileAcqConfigBean, equiptFileAcqBeanList);
//        }catch (Exception e){
//            logger.error(ExceptionUtils.getStackTrace(e));
//            throw new InvalidDataException("downloadFolder 获取共享文档文件失败");
//        }finally {
//            try {
//                if (null != session) {
//                    session.close();
//                }
//                if (null != diskShare) {
//                    diskShare.close();
//                }
//            } catch (IOException ex) {
//                logger.error(ex);
//            }
//        }
//
//        List<Long> ids = ApplicationContextHelper.getNextIdentityList(equiptFileAcqBeans.size());
//        equiptFileAcqBeans.forEach(e -> e.setId(ids.remove(0)));
//        return equiptFileAcqBeans;
//    }
//
//    private List<LimsEquiptFileAcqBean> scanFolderFromFtp(FTPClient ftpClient, LimsEquiptFileAcqConfigBean equiptFileAcqConfigBean, List<LimsEquiptFileAcqBean> equiptFileAcqBeanList, String path){
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeans = new ArrayList<>();
//        try{
//            FTPFile[] ftpFiles = ftpClient.listFiles();
//            for (FTPFile ftpFile : ftpFiles){
//
//                if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue; //防止对当前层级和上一层级进行递归调用
//                String wrokingDirectory = "";
//                wrokingDirectory = ftpClient.printWorkingDirectory();
//                wrokingDirectory = new String(wrokingDirectory.getBytes("iso8859-1"), "UTF-8");
//                String fileName = ftpFile.getName();
//                String gainUrl = wrokingDirectory + "/" + fileName;
//                path = path + "/" + fileName;
//
//                if (ftpFile.isFile()){
//                    Map<String, Object> fileMap = new HashMap<>();
//                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//                    String timestamp = sdf.format(ftpFile.getTimestamp().getTime());
//                    //匹配该文件是否已获取过
//                    String temp = gainUrl;
//                    Optional<LimsEquiptFileAcqBean> equiptFileAcqBeanOptional = equiptFileAcqBeanList.stream().filter(e -> temp.equals(e.getGainPath())).findFirst();
//                    if (equiptFileAcqBeanOptional.isPresent() && timestamp.equals(equiptFileAcqBeanOptional.get().getTimestamp())){ //若已获取过,则匹配修改时间，看文件是否有修改
//                        continue;
//                    }
//                    //若文件没有获取过或有过修改，则重新获取
//                    LimsEquiptFileAcqBean equiptFileAcqBean = new LimsEquiptFileAcqBean();
//                    equiptFileAcqBean.setCreatedTime(LocalDateTime.now());
//                    equiptFileAcqBean.setEquiptId(equiptFileAcqConfigBean.getEquiptId());
//                    equiptFileAcqBean.setFileName(fileName);
//                    equiptFileAcqBean.setFileSize(ftpFile.getSize());
//                    equiptFileAcqBean.setGainPath(gainUrl);
//                    equiptFileAcqBean.setTimestamp(timestamp);
//                    equiptFileAcqBean.setExectorName(EXECTOR_NAME);
//
//                    String SavePath = SystemUtils.getWorkingPath().resolve("files").resolve("equipt").toFile().getAbsolutePath()+equiptFileAcqConfigBean.getSavePath()+gainUrl;
//                    logger.info("【ftpUtils】 采集文件保存应用服务器，path: {}", SavePath);
//                    File file = new File(SavePath);
//                    if (!file.getParentFile().exists()){
//                        file.getParentFile().mkdirs();
//                    }
//                    boolean retrieveFileFlag = ftpClient.retrieveFile(new String((ftpFile.getName()).getBytes(), FTP.DEFAULT_CONTROL_ENCODING), new FileOutputStream(file));
//                    if (!retrieveFileFlag){
//                        logger.error("获取文件到本地失败！！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equipCode"), gainUrl);
//                        continue;
//                    }else{
//                        equiptFileAcqBean.setLocalPath(file.getAbsolutePath());
//                        equiptFileAcqBeans.add(equiptFileAcqBean);
//                        logger.info("获取文件到本地成功！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"), gainUrl);
//                    }
//                }else if(ftpFile.isDirectory()){
//                    boolean changeWorkingDirectoryFlag = ftpClient.changeWorkingDirectory(new String((ftpFile.getName()).getBytes(), FTP.DEFAULT_CONTROL_ENCODING));
//                    if (!changeWorkingDirectoryFlag) {
//                        logger.error("设备文件->本地  切换目录失败！！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"), gainUrl);
//                        continue;
//                    }
//                    equiptFileAcqBeans.addAll(scanFolderFromFtp(ftpClient, equiptFileAcqConfigBean, equiptFileAcqBeanList, path));
//                }
//            }
//        }catch(Exception e){
//            e.printStackTrace();
//            logger.error("设备文件->本地  采集文件异常!  equiptCode:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"));
//            throw  new InvalidDataException("设备文件->本地  异常信息："+e.getMessage());
//        }finally{
//            try {
//                ftpClient.changeWorkingDirectory("../");
//            } catch (IOException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//                logger.error("设备文件->本地  采集文件异常!  equiptCode:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"));
//                throw  new InvalidDataException("设备文件->本地  异常信息："+e.getMessage());
//            }
//        }
//        return equiptFileAcqBeanList;
//    }
//
//    private List<LimsEquiptFileAcqBean> scanFolderFromDocV1(String path, String localPath, LimsEquiptFileAcqConfigBean equiptFileAcqConfigBean, List<LimsEquiptFileAcqBean> equiptFileAcqBeans){
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeanList = new ArrayList<>();
//        String ip = equiptFileAcqConfigBean.getIp();
//        String port = equiptFileAcqConfigBean.getPort();
//        String username = equiptFileAcqConfigBean.getUsername();
//        String password = equiptFileAcqConfigBean.getPassword();
//        SmbFile smbDirectory = SmbV1Utils.getSmbFile(path, ip, username, password);
//        List<Map<String, Object>> fileMaps = new ArrayList<>();
//        try{
//            if (!smbDirectory.exists()){
//                return Collections.emptyList();
//            }
//            SmbFile[] smbFiles = smbDirectory.listFiles();
//            for (SmbFile smbFile : smbFiles){
//                if(smbFile.getName().equals(".")||smbFile.getName().equals(".."))continue; //防止对当前层级和上一层级进行递归调用
//                String gainUrl = smbFile.getUncPath();
//                gainUrl = gainUrl.replaceAll("\\\\","/").replace("//"+ip,"");
//                String fileName = smbFile.getName();
//
//                if (smbFile.isFile()){
//                    Map<String, Object> fileMap = new HashMap<>();
//                    LocalDateTime localtimestamp = LocalDateTime.ofInstant(Instant.ofEpochMilli(smbFile.getLastModified()), ZoneId.systemDefault());
//                    DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//                    String timestamp = localtimestamp.format(dft);
//                    //匹配该文件是否已获取过
//                    String temp = gainUrl;
//                    Optional<LimsEquiptFileAcqBean> acqSheetOptional = equiptFileAcqBeans.stream().filter(e -> temp.equals(e.getGainPath())).findFirst();
//                    if (acqSheetOptional.isPresent() && timestamp.equals(acqSheetOptional.get().getTimestamp())){ //若已获取过,则匹配修改时间，看文件是否有修改
//                        continue;
//                    }
//                    //若文件没有获取过或有过修改，则重新获取
//                    LimsEquiptFileAcqBean equiptFileAcqBean = new LimsEquiptFileAcqBean();
//                    equiptFileAcqBean.setId(ApplicationContextHelper.getNextIdentity());
//                    equiptFileAcqBean.setCreatedTime(LocalDateTime.now());
//                    equiptFileAcqBean.setEquiptId(equiptFileAcqConfigBean.getEquiptId());
//                    equiptFileAcqBean.setFileName(fileName);
//                    equiptFileAcqBean.setGainPath(gainUrl);
//                    equiptFileAcqBean.setTimestamp(timestamp);
//                    equiptFileAcqBean.setExectorName(EXECTOR_NAME);
//
//                    File file = new File(localPath);
//                    if (!file.getParentFile().exists()){
//                        file.getParentFile().mkdirs();
//                    }
//
//                    InputStream in = null;
//                    OutputStream out = null;
//                    try {
//                        in = new BufferedInputStream(new SmbFileInputStream(smbFile));
//                        out = new BufferedOutputStream(new FileOutputStream(file));
//                        byte[] buffer = new byte[1024];
//                        while (in.read(buffer) != -1) {
//                            out.write(buffer);
//                            buffer = new byte[1024];
//                        }
//                    }catch (Exception e){
//                        e.printStackTrace();
//                        logger.error("获取文件到本地失败！！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"), gainUrl);
//                    }finally {
//                        try {
//                            out.close();
//                            in.close();
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
//
//                    equiptFileAcqBean.setLocalPath(file.getAbsolutePath());
//                    equiptFileAcqBeanList.add(equiptFileAcqBean);
//                    logger.info("获取文件到本地成功！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"), gainUrl);
//                }else if(smbFile.isDirectory()){
//                    equiptFileAcqBeanList.addAll(scanFolderFromDocV1(path+"/"+smbFile.getName(),localPath+"/"+smbFile.getName(), equiptFileAcqConfigBean, equiptFileAcqBeans));
//                }
//            }
//        }catch(Exception e){
//            e.printStackTrace();
//            logger.error("设备文件->本地  采集文件异常!  equiptCode:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"));
//            throw  new InvalidDataException("设备文件->本地  异常信息："+e.getMessage());
//        }
//        return equiptFileAcqBeanList;
//    }
//
//    private List<LimsEquiptFileAcqBean> scanFolderFromDocV23(DiskShare diskShare, String filePath, String localPath, LimsEquiptFileAcqConfigBean equiptFileAcqConfigBean, List<LimsEquiptFileAcqBean> equiptFileAcqBeanList) {
//        List<LimsEquiptFileAcqBean> equiptFileAcqBeans = new ArrayList<>();
//        String subStr = filePath.indexOf("/")!=0? filePath:filePath.substring(1,filePath.length());
//
//        try{
//            List<FileIdBothDirectoryInformation> fileIdBothDirectoryInformationList = diskShare.list(subStr,"*");
//            for (FileIdBothDirectoryInformation fileIdBothDirectoryInformation : fileIdBothDirectoryInformationList){
//                String fileName = fileIdBothDirectoryInformation.getFileName();
//                if(fileName.equals(".") || fileName.equals(".."))continue; //防止对当前层级和上一层级进行递归调用
//                if (!((fileIdBothDirectoryInformation.getFileAttributes() & 0x10) == 0)){
//                    equiptFileAcqBeans.addAll(scanFolderFromDocV23(diskShare, filePath+"/"+fileName,localPath+"/"+fileName, equiptFileAcqConfigBean, equiptFileAcqBeanList));
//                }else{
//                    String sharePath = subStr+"/"+fileName;
//                    if (sharePath.indexOf("/") == 0) sharePath = sharePath.substring(1,sharePath.length());
//                    com.hierynomus.smbj.share.File shareFile = diskShare.openFile(sharePath, EnumSet.of(AccessMask.GENERIC_READ),
//                            EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL), SMB2ShareAccess.ALL,
//                            SMB2CreateDisposition.FILE_OPEN_IF, EnumSet.noneOf(SMB2CreateOptions.class));
//
//                    Map<String, Object> fileMap = new HashMap<>();
//                    Long epochMilli = shareFile.getFileInformation().getBasicInformation().getLastWriteTime().toEpochMillis();
//                    LocalDateTime localtimestamp = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
//                    DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//                    String timestamp = localtimestamp.format(dft);
//                    //匹配该文件是否已获取过
//                    String temp = shareFile.getFileName().replaceAll("\\\\","/").replace("//"+diskShare.getSmbPath().getHostname(),"");;
//                    Optional<LimsEquiptFileAcqBean> acqSheetOptional = equiptFileAcqBeanList.stream().filter(e -> temp.equals(e.getGainPath())).findFirst();
//                    if (acqSheetOptional.isPresent() && timestamp.equals(acqSheetOptional.get().getTimestamp())){ //若已获取过,则匹配修改时间，看文件是否有修改
//                        continue;
//                    }
////                    //若文件没有获取过或有过修改，则重新获取
//                    LimsEquiptFileAcqBean equiptFileAcqBean = new LimsEquiptFileAcqBean();
//                    equiptFileAcqBean.setId(ApplicationContextHelper.getNextIdentity());
//                    equiptFileAcqBean.setCreatedTime(LocalDateTime.now());
//                    equiptFileAcqBean.setEquiptId(equiptFileAcqConfigBean.getEquiptId());
//                    equiptFileAcqBean.setFileName(fileName);
//                    equiptFileAcqBean.setGainPath(temp);
//                    equiptFileAcqBean.setTimestamp(timestamp);
//                    equiptFileAcqBean.setExectorName(EXECTOR_NAME);
//
//                    String saveUrl = (localPath+"/"+fileName).replace(SystemUtils.getWorkingPath().resolve("files").resolve("equipt").toFile().getAbsolutePath(),"");
////
//                    File file = new File(SystemUtils.getWorkingPath().resolve("files").resolve("equipt").toFile().getAbsolutePath()+saveUrl);
//                    if (!file.getParentFile().exists()){
//                        file.getParentFile().mkdirs();
//                    }
//
//                    InputStream is = null;
//                    OutputStream os = null;
//                    try {
//                        is = shareFile.getInputStream();
//                        os = new FileOutputStream(file);
//                        byte[] buffer = new byte[1024];
//                        while (is.read(buffer) != -1) {
//                            os.write(buffer);
//                            buffer = new byte[1024];
//                        }
//                    }catch (Exception e){
//                        logger.error("获取文件到本地失败！！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"), temp);
//                        continue;
//                    }finally {
//                        try {
//                            if (null != os) {
//                                os.close();
//                            }
//                            if (null != is) {
//                                is.close();
//                            }
//                        } catch (IOException ex) {
//                            logger.error(ex);
//                        }
//                    }
//
//                    equiptFileAcqBean.setLocalPath(file.getAbsolutePath());
//                    equiptFileAcqBeans.add(equiptFileAcqBean);
//                    logger.info("获取文件到本地成功！	equiptCode:{} fileUrl:{}", equiptFileAcqConfigBean.getExt$Item("equiptCode"), temp);
//                }
//            }
//        }catch (Exception e){
//            logger.error(ExceptionUtils.getStackTrace(e));
//            throw new InvalidDataException("scanFolder 遍历“"+filePath+"”文件夹失败");
//        }finally {
//
//        }
//
//        return equiptFileAcqBeans;
//    }
//
//    @Override
//    public void analysisFiles(List<LimsEquiptFileAcqBean> equiptFileAcqBeans) {
//
//    }
//}
